package main

import "fmt"

func main() {
	x := 3
	fmt.Println("&x =", &x)

	fmt.Println("x =", x)
	x1 := add1(x)
	fmt.Println("x1 =", x1)
	fmt.Println("x =", x) //值传递，x值不改变

	x2 := add2(&x)
	fmt.Println("x2 =", x2)
	fmt.Println("x =", x) //地址传递，x值改变

	arr := []int{1, 2, 3}
	update(arr)
	fmt.Println(arr)
}

//值传递
func add1(a int) int {
	a = a + 1
	return a
}

//指针（地址）传递
func add2(a *int) int {
	*a = *a + 1
	return *a
}

//go语言中的channel slice map三种类型本身就是地址，可以直接传递给指针变量
func update(arr []int) {
	arr[0] = 2
}
